package mecproc;

import espest.EstadoAbstracto;
import espest.Operador;
import espest.Transicao;

public class No<E extends EstadoAbstracto> {
	
	private No<E> antecessor;
	private E estado;
	private Operador<E> operador;
	private int prof;
	private double custo;
	private boolean aberto;
	private double heuristica;
	private double F;
	
	public No(E estado){
		iniciar(estado, null, null, 0);
	}
	
	public No(Transicao<E> transicao, No<E> no){
		iniciar(transicao.getEstadoSuc(),transicao.getOperador(), no, transicao.getCusto());
	}
	
	
	
	private void iniciar(E estado, Operador<E> operador, No<E> antecessor, double custoTrans){
		this.estado = estado;
		this.operador = operador;
		this.antecessor = antecessor;
		
		if(antecessor!=null){
			this.custo = custoTrans + this.antecessor.getCusto();
			this.prof = antecessor.getProf() + 1;
		}
	}
	
	public double getCusto(){
		return custo;
	}

	public int getProf(){
		return prof;
	}
	
	public Operador<E> getOperador(){
		return operador;
	}
	
	public No<E> getAntecessor(){
		return antecessor;
	}
	
	public E getEstado(){
		return estado;
	}
	
	public void setAberto(boolean val){
		aberto = val;
	}
	
	public boolean aberto(){
		return aberto;
	}
	
	public void setHeur(double heur){
		F = custo + heur;
		heuristica = heur;
	}
	
	public double getHeur(){
		return heuristica;
	}
	
	public double getF(){
		return F;
	}
}
